{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import r2_score  # 评价回归预测模型的性能\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.preprocessing import OneHotEncoder\n",
    "from sklearn.preprocessing import MaxAbsScaler\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.linear_model import LassoCV"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.导入数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.1 丢弃不需要的特征、以及强相关特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 导入数据\n",
    "data_day = pd.read_csv(\"./data/day.csv\")\n",
    "data = data_day.drop([\"instant\", \"dteday\", \"temp\", \"casual\", \"registered\"], axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.2 训练数据和测试数据分割"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(365, 10)\n",
      "(366, 10)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>dteday</th>\n",
       "      <th>season</th>\n",
       "      <th>yr</th>\n",
       "      <th>mnth</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weathersit</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2011-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.344167</td>\n",
       "      <td>0.363625</td>\n",
       "      <td>0.805833</td>\n",
       "      <td>0.160446</td>\n",
       "      <td>331</td>\n",
       "      <td>654</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2011-01-02</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.363478</td>\n",
       "      <td>0.353739</td>\n",
       "      <td>0.696087</td>\n",
       "      <td>0.248539</td>\n",
       "      <td>131</td>\n",
       "      <td>670</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>2011-01-03</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.196364</td>\n",
       "      <td>0.189405</td>\n",
       "      <td>0.437273</td>\n",
       "      <td>0.248309</td>\n",
       "      <td>120</td>\n",
       "      <td>1229</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>2011-01-04</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>0.212122</td>\n",
       "      <td>0.590435</td>\n",
       "      <td>0.160296</td>\n",
       "      <td>108</td>\n",
       "      <td>1454</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>2011-01-05</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.226957</td>\n",
       "      <td>0.229270</td>\n",
       "      <td>0.436957</td>\n",
       "      <td>0.186900</td>\n",
       "      <td>82</td>\n",
       "      <td>1518</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>2011-01-06</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.204348</td>\n",
       "      <td>0.233209</td>\n",
       "      <td>0.518261</td>\n",
       "      <td>0.089565</td>\n",
       "      <td>88</td>\n",
       "      <td>1518</td>\n",
       "      <td>1606</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>2011-01-07</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.196522</td>\n",
       "      <td>0.208839</td>\n",
       "      <td>0.498696</td>\n",
       "      <td>0.168726</td>\n",
       "      <td>148</td>\n",
       "      <td>1362</td>\n",
       "      <td>1510</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>2011-01-08</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.165000</td>\n",
       "      <td>0.162254</td>\n",
       "      <td>0.535833</td>\n",
       "      <td>0.266804</td>\n",
       "      <td>68</td>\n",
       "      <td>891</td>\n",
       "      <td>959</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant      dteday  season  yr  mnth  holiday  weekday  workingday  \\\n",
       "0        1  2011-01-01       1   0     1        0        6           0   \n",
       "1        2  2011-01-02       1   0     1        0        0           0   \n",
       "2        3  2011-01-03       1   0     1        0        1           1   \n",
       "3        4  2011-01-04       1   0     1        0        2           1   \n",
       "4        5  2011-01-05       1   0     1        0        3           1   \n",
       "5        6  2011-01-06       1   0     1        0        4           1   \n",
       "6        7  2011-01-07       1   0     1        0        5           1   \n",
       "7        8  2011-01-08       1   0     1        0        6           0   \n",
       "\n",
       "   weathersit      temp     atemp       hum  windspeed  casual  registered  \\\n",
       "0           2  0.344167  0.363625  0.805833   0.160446     331         654   \n",
       "1           2  0.363478  0.353739  0.696087   0.248539     131         670   \n",
       "2           1  0.196364  0.189405  0.437273   0.248309     120        1229   \n",
       "3           1  0.200000  0.212122  0.590435   0.160296     108        1454   \n",
       "4           1  0.226957  0.229270  0.436957   0.186900      82        1518   \n",
       "5           1  0.204348  0.233209  0.518261   0.089565      88        1518   \n",
       "6           2  0.196522  0.208839  0.498696   0.168726     148        1362   \n",
       "7           2  0.165000  0.162254  0.535833   0.266804      68         891   \n",
       "\n",
       "    cnt  \n",
       "0   985  \n",
       "1   801  \n",
       "2  1349  \n",
       "3  1562  \n",
       "4  1600  \n",
       "5  1606  \n",
       "6  1510  \n",
       "7   959  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# # 日期类型\n",
    "# data_day['dteday'] = pd.to_datetime(data_day['dteday'])\n",
    "# data = data_day.set_index(\"dteday\", drop=True)\n",
    "data_2011 = data[data_day[\"yr\"] == 0].drop(['yr'], axis=1)\n",
    "data_2012 = data[data_day[\"yr\"] == 1].drop(['yr'], axis=1)\n",
    "\n",
    "print(data_2011.shape)\n",
    "print(data_2012.shape)\n",
    "# 查看前5条数据\n",
    "data_day.head(8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.数据预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.1去除异常数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(358, 10)\n"
     ]
    }
   ],
   "source": [
    "# data_2011 = data_2011[data_2011[\"cnt\"] > 1200]\n",
    "data_2011 = data_2011[data_2011[\"atemp\"] < 0.8]\n",
    "data_2011 = data_2011[data_2011[\"hum\"] > 0.27]\n",
    "data_2011 = data_2011[data_2011[\"windspeed\"] < 0.4]\n",
    "print(data_2011.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['season1', 'season2', 'season3', 'season4', 'mnth', 'holiday0', 'holiday1', 'weekday', 'workingday0', 'workingday1', 'weathersit1', 'weathersit2', 'weathersit3', 'atemp', 'hum', 'windspeed']\n"
     ]
    }
   ],
   "source": [
    "y_train = data_2011['cnt'].values\n",
    "X_train = data_2011.drop('cnt', axis=1)\n",
    "y_test = data_2012['cnt'].values\n",
    "X_test = data_2012.drop('cnt', axis=1)\n",
    "columns = X_train.columns\n",
    "columns = ['season1', 'season2', 'season3', 'season4',\n",
    "           'mnth', # 'mnth1', 'mnth2', 'mnth3', 'mnth4', 'mnth5', 'mnth6', 'mnth7', 'mnth8', 'mnth9', 'mnth10', 'mnth11', 'mnth12',\n",
    "           'holiday0', 'holiday1',\n",
    "           'weekday', # 'weekday0', 'weekday1', 'weekday2', 'weekday3', 'weekday4', 'weekday5', 'weekday6',\n",
    "           'workingday0', 'workingday1',\n",
    "           'weathersit1', 'weathersit2', 'weathersit3',\n",
    "           # 'weathersit4',\n",
    "           'atemp', 'hum', 'windspeed']\n",
    "print(columns)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2 对数据进行标准化，y值做了归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 分别初始化对特征和目标值的标准化器\n",
    "ss_X = StandardScaler()\n",
    "ss_y = StandardScaler()\n",
    "ohe_X = OneHotEncoder(categorical_features=np.array([0, 2, 4, 5]))\n",
    "mms_y = MinMaxScaler()\n",
    "mas_y = MaxAbsScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征以及目标值进行标准化处理\n",
    "X_train = ohe_X.fit_transform(X_train).toarray()\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "X_test = ohe_X.transform(X_test).toarray()\n",
    "X_test = ss_X.transform(X_test)\n",
    "\n",
    "y_train = mas_y.fit_transform(y_train.reshape(-1, 1))\n",
    "y_test = mas_y.fit_transform(y_test.reshape(-1, 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.确定模型类型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.1 尝试缺省参数的线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                      coef      columns\n",
      "13        [0.138916015625]        atemp\n",
      "11        [0.014404296875]  weathersit2\n",
      "12     [0.010040283203125]  weathersit3\n",
      "15  [-0.02773284912109375]    windspeed\n",
      "14      [-0.0325927734375]          hum\n",
      "0     [-64764413882.06916]      season1\n",
      "3    [-65015272315.243614]      season4\n",
      "2     [-65745872716.42869]      season3\n",
      "1     [-65982216395.82621]      season2\n",
      "10     [-85677266856.7345]  weathersit1\n",
      "9     [-209898266366.7417]  workingday1\n",
      "8     [-214822014636.0157]  workingday0\n",
      "7      [-235671124958.941]      weekday\n",
      "6    [-235671124958.94144]     holiday1\n",
      "4     [-1670895636783.215]         mnth\n",
      "5     [-1670895636783.226]     holiday0\n"
     ]
    }
   ],
   "source": [
    "# 使用默认配置初始化\n",
    "lr = LinearRegression()\n",
    "\n",
    "# 训练模型参数\n",
    "lr.fit(X_train, y_train)\n",
    "# 预测\n",
    "y_train_pred_lr = lr.predict(X_train)\n",
    "y_test_pred_lr = lr.predict(X_test)\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\": list(columns), \"coef\": list(lr.coef_.T)})\n",
    "fs = fs.sort_values(by=['coef'], ascending=False)\n",
    "print(fs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n+Wag1ovdOAT0t771Lfbff3/e+ta38pOf/GTT9s4880xuu+22TdOjR48GYO3atUyfPp03v/nNHHLI\nIdxxxx1b1LZixQqOOeYYWlpaOPjgg7nvvvvqatO9997LCSecAEBbWxvvf//7mTZtGvvuu+9rwvv6\n669nypQptLS08MEPfnBT8J5zzjm0trZy0EEHbfoeQG3I60suuYS//uu/5tZbb62rlnrVc7j7z8Db\nMnNtRDQB90fEndWy8zLztq28VpI0yGzYsIG5c+dy1llnAXDXXXexZMkSHnzwQTKTk046iXnz5rFq\n1Sr22GMPfvCDHwDwwgsvvGY7K1as4OKLL2bBggWMGTOGY489lsmTJ29136NGjeL2229np5124tln\nn+XII4/kpJNOes0FWDfeeCPHHXccF110ERs2bOCPf/xjj9r5q1/9invuuYc1a9ZwwAEHcM4557B0\n6VJuvvlmfvKTn9DU1MSHP/xhbrjhBs444wwuvfRSxo4dy4YNG5g+fTqLFi3i0EMP3VT3/fff36M6\ntqbLkM7MBDaeBGiqHtnwSiRJA+pPf/oTLS0tPPHEE7zlLW/hHe94B1AL6bvuumtTwK5du5YlS5Zw\n9NFH8+lPf5rPfOYznHDCCRx99NGv2d4DDzzAtGnTaG6ufdjTKaecwuOPP77VGjKTCy+8kHnz5rHN\nNtuwfPlyVq5cyete97pN6xx++OG8//3vZ926dZx88sm0tPTsQO6MGTPYbrvt2G677Rg3bhwrV65k\n7ty5LFiwgMMPP3zT92TcuHEA3HLLLcyZM4f169ezYsUKHn300U0hfcopp/Sohq7UdU46IkZExELg\nGeDuzHygWnRpRCyKiK9GxHZ9UqEkqV9sPCf95JNP8sorr2w6J52ZXHDBBSxcuJCFCxeydOlSzjrr\nLPbff38WLFjAIYccwgUXXMAll1yyxTY7uwVp5MiRvPrqq5u2/8orrwBwww03sGrVKhYsWMDChQvZ\nfffdt7jP+JhjjmHevHnsueeenH766Vx33XU9au922/0ltkaMGMH69evJTGbNmrWprY899hhtbW38\n9re/5fLLL2fu3LksWrSIGTNmvKauHXbYoUc1dKWuq7szcwPQEhE7A7dHxMHABcDvgW2BOcBngC1+\nQhExG5gNMHHixAaVLWkwqveK5UZf2azuGTNmDFdccQUzZ87knHPO4bjjjuOzn/0sp556KqNHj2b5\n8uU0NTWxfv16xo4dy2mnncbo0aO55pprXrOdI444go997GOsXr2anXbaiVtvvZXDDjsMqJ3HXbBg\nAe9973u54447WLduHVA7ZD5u3Diampq45557ePLJLT/R8cknn2TPPffk7LPP5qWXXuKhhx7ijDPO\naEjbp0+fzsyZM/nEJz7BuHHjeO6551izZg0vvvgiO+ywA2PGjGHlypXceeedTJs2rSH73Jpu3YKV\nmc9HxL3A8Zl5eTX7zxHxLeDTnbxmDrUQp7W11cPkklSHgX6jMnnyZA477DBuuukmTj/9dBYvXszU\nqVOB2kVe119/PUuXLuW8885jm222oampiauvvvo12xg/fjxtbW1MnTqV8ePH8+Y3v3nTRVhnn302\nM2fOZMqUKUyfPn1TT/TUU0/lxBNPpLW1lZaWFt74xjduUdu9997LZZddRlNTE6NHj+60Jz1jxoxN\nY2ZPnTqVj3zkI122+8ADD+Tzn/8873znO3n11Vdpamriqquu4sgjj2Ty5MkcdNBB7Lvvvhx11FH1\nfzN7IWqnnLeyQkQzsK4K6O2Bu4AvAgsyc0XUjmV8FXg5M8/f2rZaW1tz4xV/koYfe9KdW7x4MW96\n05sGugz1gY5+thGxIDNbO3nJJvX0pMcD10bECGrnsG/JzO9HxI+rAA9gIfCh7pcuSZI6U8/V3YuA\nLa6Zz8y39UlFkiQJcMQxSSpGV6cfNfj09mdqSEtSAUaNGsXq1asN6iFk4+dJjxo1qsfb8AM2JKkA\nEyZMYNmyZaxatWqgS1EDjRo1igkTJvT49Ya0JBWgqamJffbZZ6DLUGE83C1JUqEMaUmSCmVIS5JU\nKENakqRCGdKSJBXKkJYkqVCGtCRJhTKkJUkqlIOZSBq0/OhLDXX2pCVJKpQhLUlSoQxpSZIKZUhL\nklQoQ1qSpEIZ0pIkFcqQliSpUN4nLUnteO+1SmJPWpKkQhnSkiQVypCWJKlQhrQkSYUypCVJKpQh\nLUlSoQxpSZIKZUhLklQoQ1qSpEIZ0pIkFcqQliSpUIa0JEmFMqQlSSpUlyEdEaMi4sGI+EVEPBIR\nn6vm7xMRD0TEkoi4OSK27ftyJUkaPurpSf8ZeFtmHga0AMdHxJHAF4GvZuZ+wB+As/quTEmShp8u\nQzpr1laTTdUjgbcBt1XzrwVO7pMKJUkapuo6Jx0RIyJiIfAMcDfwa+D5zFxfrbIM2LNvSpQkaXiq\nK6Qzc0NmtgATgCnAmzparaPXRsTsiJgfEfNXrVrV80olSRpmunV1d2Y+D9wLHAnsHBEjq0UTgKc7\nec2czGzNzNbm5ube1CpJ0rBSz9XdzRGxc/V8e+DtwGLgHuA91WqzgDv6qkhJkoajkV2vwnjg2ogY\nQS3Ub8nM70fEo8BNEfF54OfAN/qwTkmShp0uQzozFwGTO5j/G2rnpyVJUh9wxDFJkgplSEuSVChD\nWpKkQhnSkiQVypCWJKlQhrQkSYUypCVJKpQhLUlSoQxpSZIKZUhLklQoQ1qSpEIZ0pIkFcqQliSp\nUIa0JEmFMqQlSSqUIS1JUqEMaUmSCmVIS5JUKENakqRCGdKSJBXKkJYkqVAjB7oASWVqa2vsegNp\nMNQodcSetCRJhTKkJUkqlCEtSVKhDGlJkgplSEuSVChDWpKkQhnSkiQVyvukJfWK9yBLfceetCRJ\nhTKkJUkqlCEtSVKhDGlJkgplSEuSVKguQzoi9oqIeyJicUQ8EhEfq+a3RcTyiFhYPd7d9+VKkjR8\n1HML1nrgU5n5UETsCCyIiLurZV/NzMv7rjxJkoavLkM6M1cAK6rnayJiMbBnXxcmSdJw161z0hEx\nCZgMPFDNOjciFkXENyNil05eMzsi5kfE/FWrVvWqWEmShpO6QzoiRgP/DHw8M18ErgZeD7RQ62l/\nuaPXZeaczGzNzNbm5uYGlCxJ0vBQV0hHRBO1gL4hM78LkJkrM3NDZr4KfA2Y0ndlSpI0/NRzdXcA\n3wAWZ+ZX2s0f3261vwEebnx5kiQNX/Vc3X0UcDrwy4hYWM27EHhfRLQACTwBfLBPKpQkaZiq5+ru\n+4HoYNEPG1+OJEnayBHHJEkqlCEtSVKhDGlJkgplSEuSVChDWpKkQhnSkiQVypCWJKlQhrQkSYUy\npCVJKpQhLUlSoQxpSZIKZUhLklQoQ1qSpEIZ0pIkFcqQliSpUIa0JEmFMqQlSSqUIS1JUqEMaUmS\nCmVIS5JUqJEDXYAkba6tbaArkMpgT1qSpEIZ0pIkFcqQliSpUIa0JEmFMqQlSSqUIS1JUqEMaUmS\nCmVIS5JUKENakqRCGdKSJBXKkJYkqVCGtCRJhTKkJUkqVJchHRF7RcQ9EbE4Ih6JiI9V88dGxN0R\nsaT6ukvflytJ0vBRT096PfCpzHwTcCTwkYg4EDgfmJuZ+wFzq2lJktQgXYZ0Zq7IzIeq52uAxcCe\nwEzg2mq1a4GT+6pISZKGo5HdWTkiJgGTgQeA3TNzBdSCPCLGdfKa2cBsgIkTJ/amVkkN0NY20BVI\nqlfdF45FxGjgn4GPZ+aL9b4uM+dkZmtmtjY3N/ekRkmShqW6QjoimqgF9A2Z+d1q9sqIGF8tHw88\n0zclSpI0PNVzdXcA3wAWZ+ZX2i36HjCrej4LuKPx5UmSNHzVc076KOB04JcRsbCadyHwBeCWiDgL\n+B3wX/qmREmShqcuQzoz7weik8XTG1uOJEnayBHHJEkqlCEtSVKhDGlJkgplSEuSVChDWpKkQhnS\nkiQVypCWJKlQhrQkSYUypCVJKpQhLUlSoQxpSZIKZUhLklQoQ1qSpEIZ0pIkFcqQliSpUIa0JEmF\nMqQlSSqUIS1JUqEMaUmSCmVIS5JUqJEDXYAkDUZtbY1dT+qIPWlJkgplSEuSVChDWpKkQhnSkiQV\nypCWJKlQhrQkSYUypCVJKpQhLUlSoQxpSZIKZUhLklQoQ1qSpEIZ0pIkFcqQliSpUF2GdER8MyKe\niYiH281ri4jlEbGwery7b8uUJGn4qacnfQ1wfAfzv5qZLdXjh40tS5IkdRnSmTkPeK4fapEkSe30\n5pz0uRGxqDocvktnK0XE7IiYHxHzV61a1YvdSZI0vPQ0pK8GXg+0ACuAL3e2YmbOyczWzGxtbm7u\n4e4kSRp+ehTSmbkyMzdk5qvA14ApjS1LkiT1KKQjYny7yb8BHu5sXUmS1DMju1ohIr4DTAN2i4hl\nwMXAtIhoARJ4AvhgH9YoSdKw1GVIZ+b7Opj9jT6oRZIkteOIY5IkFcqQliSpUIa0JEmFMqQlSSqU\nIS1JUqEMaUmSCmVIS5JUKENakqRCGdKSJBXKkJYkqVCGtCRJhTKkJUkqVJcfsCFp4LS1NXY9SYOL\nPWlJkgplSEuSVChDWpKkQhnSkiQVypCWJKlQhrQkSYUypCVJKpT3SUsN5P3KkhrJnrQkSYUypCVJ\nKpQhLUlSoQxpSZIKZUhLklQoQ1qSpEIZ0pIkFcqQliSpUA5mIkl9qN4BbhwIRx2xJy1JUqEMaUmS\nCmVIS5JUKENakqRCdRnSEfHNiHgmIh5uN29sRNwdEUuqr7v0bZmSJA0/9fSkrwGO32ze+cDczNwP\nmFtNS5KkBuoypDNzHvDcZrNnAtdWz68FTm5wXZIkDXs9vU9698xcAZCZKyJiXGcrRsRsYDbAxIkT\ne7g7aeB4/6r6Q3d+z/ydHD76/MKxzJyTma2Z2drc3NzXu5MkacjoaUivjIjxANXXZxpXkiRJgp6H\n9PeAWdXzWcAdjSlHkiRtVM8tWN8BfgocEBHLIuIs4AvAOyJiCfCOalqSJDVQlxeOZeb7Olk0vcG1\nSJKkdhxxTJKkQhnSkiQVypCWJKlQPR3MRFJBHNxCGprsSUuSVChDWpKkQhnSkiQVypCWJKlQhrQk\nSYUypCVJKpQhLUlSoQxpSZIKZUhLklQoQ1qSpEIZ0pIkFcqQliSpUIa0JEmFMqQlSSqUIS1JUqEM\naUmSCjVyoAuQJHVPW1tj11O57ElLklQoQ1qSpEIZ0pIkFcqQliSpUIa0JEmFMqQlSSqUIS1JUqEM\naUmSCuVgJho0HMBB0nBjT1qSpEIZ0pIkFcqQliSpUIa0JEmF6tWFYxHxBLAG2ACsz8zWRhQlSZIa\nc3X3sZn5bAO2I0mS2vFwtyRJheptSCdwV0QsiIjZjShIkiTV9PZw91GZ+XREjAPujohfZea89itU\n4T0bYOLEib3cndQ4Dnqioc4BgAa/XvWkM/Pp6uszwO3AlA7WmZOZrZnZ2tzc3JvdSZI0rPQ4pCNi\nh4jYceNz4J3Aw40qTJKk4a43h7t3B26PiI3buTEz/7UhVUmSpJ6HdGb+BjisgbVIkqR2vAVLkqRC\nGdKSJBXKkJYkqVCNGBZUKor3fEoaKuxJS5JUKENakqRCGdKSJBXKkJYkqVCGtCRJhTKkJUkqlCEt\nSVKhDGlJkgrlYCaSNMz1xQBADirUGPakJUkqlCEtSVKhDGlJkgplSEuSVChDWpKkQhnSkiQVypCW\nJKlQhrQkSYVyMBMB9Q880OgBChzwQJI6Z09akqRCGdKSJBXKkJYkqVCGtCRJhTKkJUkqlCEtSVKh\nDGlJkgo1qO+T7s49toPhftxG36s8GNosaXgbyP9ng+F/qT1pSZIKZUhLklQoQ1qSpEIZ0pIkFcqQ\nliSpUL0K6Yg4PiIei4ilEXF+o4qSJEm9COmIGAFcBbwLOBB4X0Qc2KjCJEka7nrTk54CLM3M32Tm\nK8BNwMzGlCVJkiIze/bCiPcAx2fmB6rp04EjMvPczdabDcyuJg8AHut5uQ2zG/DsQBfRx4Z6G4d6\n+8A2DgVDvX0w9NvYV+3bOzObu1qpNyOORQfztkj8zJwDzOnFfhouIuZnZutA19GXhnobh3r7wDYO\nBUO9fTD02zjQ7evN4e5lwF7tpicAT/euHEmStFFvQvo/gP0iYp+I2Bb4W+B7jSlLkiT1+HB3Zq6P\niHOBfwNGAN/MzEcaVlnfKurwex8Z6m0c6u0D2zgUDPX2wdBv44C2r8cXjkmSpL7liGOSJBXKkJYk\nqVDDIqQjYmxE3B0RS6qvu2xl3Z0iYnlEXNmfNfZWPW2MiL0jYkFELIyIRyLiQwNRa0/U2b6WiPhp\n1bZFEXHKQNTaU/X+nkbEv0bE8xHx/f6usSe6Gj44IraLiJur5Q9ExKT+r7J36mjjMRHxUESsr8aY\nGFTqaN8nI+LR6u9ubkTsPRB19kYdbfxQRPyy+v95f3+NsDksQho4H5ibmfsBc6vpzvwD8O/9UlVj\n1dPGFcBfZWYLcARwfkTs0Y819kY97fsjcEZmHgQcD/xjROzcjzX2Vr2/p5cBp/dbVb1Q5/DBZwF/\nyMw3AF8Fvti/VfZOnW38HXAmcGP/Vtd7dbbv50BrZh4K3AZ8qX+r7J0623hjZh5S/f/8EvCV/qht\nuIT0TODa6vm1wMkdrRQRbwF2B+7qp7oaqcs2ZuYrmfnnanI7BtfPv572PZ6ZS6rnTwPPAF2O6FOQ\nun5PM3MusKa/iuqleoYPbt/u24DpEdHRYEml6rKNmflEZi4CXh2IAnupnvbdk5l/rCZ/Rm3cjMGk\nnja+2G5yBzoYvKsvDKZ/0r2xe2auAKi+jtt8hYjYBvgycF4/19YoXbYRICL2iohFwFPAF6swGwzq\nat9GETEF2Bb4dT/U1ijdauMgsSe137WNllXzOlwnM9cDLwC79kt1jVFPGwez7rbvLODOPq2o8epq\nY0R8JCJ+Ta0n/dH+KKw3w4IWJSJ+BLyug0UX1bmJDwM/zMynSn0T34A2kplPAYdWh7n/JSJuy8yV\njaqxNxrRvmo744FvA7Mys6ieS6PaOIjUM3xwXUMMF2yw19+VutsXEacBrcBb+7Sixqt3mOurgKsi\n4u+Avwdm9XVhQyakM/PtnS2LiJURMT4zV1T/wJ/pYLWpwNER8WFgNLBtRKzNzGI+J7sBbWy/racj\n4hHgaGqHGAdcI9oXETsBPwD+PjN/1kel9lgjf4aDRD3DB29cZ1lEjATGAM/1T3kNMdSHSK6rfRHx\ndmpvNt/a7rTaYNHdn+FNwNV9WlFluBzu/h5/ecczC7hj8xUy89TMnJiZk4BPA9eVFNB16LKNETEh\nIravnu8CHEUZn0pWj3raty1wO7Wf3a39WFujdNnGQaie4YPbt/s9wI9zcI2yNNSHSO6yfRExGfg/\nwEmZORjfXNbTxv3aTc4AlvRLZZk55B/Uzm/Nrb6pc4Gx1fxW4OsdrH8mcOVA193oNgLvABYBv6i+\nzh7ouhvcvtOAdcDCdo+Wga69kW2spu8DVgF/otYDOG6ga++iXe8GHqd2fcBF1bxLqP1DBxgF3Aos\nBR4E9h3omvugjYdXP6uXgNXAIwNdc4Pb9yNgZbu/u+8NdM190MZ/Ah6p2ncPcFB/1OWwoJIkFWq4\nHO6WJGnQMaQlSSqUIS1JUqEMaUmSCmVIS5JUKENakqRCGdKSJBXq/wMkpKhZo2YNdgAAAABJRU5E\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2212ccbfeb8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of LinearRegression on train is 0.8197027894356808\n",
      "The r2 score of LinearRegression on test is 0.6404606464652964\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nArqIiDSbgnoSvffeewwePJi7776bSy+9lBkzZqS6SSIikkU0p54k//znPznxxBPZd999efPNNznh\nhBNS3SQREcky6qkn2Pbt2wE4+uijufPOO/n4448V0EVEJCEU1BNkx44dXHPNNfTv35+tW7fi8/n4\n9a9/HbZuu4iISHMoqCfA3LlzGThwII888ghnnXUWrVq1SnWTRESkBVBQj6OqqirGjRvH8ccfj8/n\n49133+XBBx+kbdu2qW6aiIi0AArqceTz+SgrK+OGG25g6dKl/PSnP011k0REpAVRUG+m8vJyfvnL\nX7Ju3TqMMcycOZN77rmHgoKCVDdNRERaGAX1Zpg9ezYHHnggjz/+OPPnzwcgNzc3wneJiIgkhoJ6\nDLZs2cLFF1/Mz3/+czp27Mj777/P6NGjU90sERFp4RTUYzB58mSmT5/OrbfeyuLFixk2zFNJXhER\nkYTShi4effvtt3z77bcccMABbN++nbVr1zJ48OCkt0NERFoWbegSZy+99BL9+/dn1KhRWGvZY489\nFNBFRCTtKKiH8fXXX3P22Wdzzjnn0KNHD5599lmMMaluloiIiCNt6OLi448/5phjjuH7779n8uTJ\n3HjjjeTl6eMSEZH0pSgVora2lpycHPr168eZZ57J9ddfz49//ONUN0tERCSihA6/G2NOMsasNsas\nMcaUOLzf2hgzo/79940xvRLZnnCstTz77LMMHDiQLVu24PP5eOKJJxTQRUQkYyQsqBtjcoFHgJOB\n/sD5xpj+IYddCmy11u4H3A/claj2hPPll1/y85//nNGjR9OxY0d27NiRimaIiIg0SyJ76ocCa6y1\na621VcBfgDNCjjkDeLb+738FjjdJzESz1vLUU08xYMAA3nnnHR588EHeffddevTokawmiIiIxE0i\n59SLgC+Cvv4SOMztGGtttTFmG7An8G0C29XIK6+8wtChQ3nyySfp06dPsi4rIiISd4kM6k497tBK\nN16OwRgzFhgLxLUXbYxh+vTptGvXjpwcre4TEZHMlshI9iWwb9DX3YGNbscYY/KADsCW0BNZa6dZ\na4dZa4d16dIlro3cY489FNBFRCQrJDKaLQL6GmN6G2NaAecBs0KOmQX8T/3fzwbm2kyrWysiIpIm\nEjb8Xj9HfjUwB8gFnrbWrjDG3AEsttbOAp4CnjPGrKGuh35eotojIiKS7RJafMZa+zrweshrvw36\n+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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2212cd240f0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 在训练集上观察预测残差的分布，看是否符合模型假设：噪声为0均值的高斯噪声\n",
    "f, ax = plt.subplots(figsize=(7, 5))\n",
    "f.tight_layout()\n",
    "ax.hist(y_train - y_train_pred_lr, bins=40, label='Residuals Linear', color='b', alpha=.5);\n",
    "ax.set_title(\"cnt of Residuals\")\n",
    "ax.legend(loc='best');\n",
    "plt.show()\n",
    "\n",
    "# 使用r2_score评价模型在测试集和训练集上的性能，并输出评估结果\n",
    "# 训练集\n",
    "print('The r2 score of LinearRegression on train is', r2_score(y_train, y_train_pred_lr))\n",
    "# 测试集\n",
    "print('The r2 score of LinearRegression on test is', r2_score(y_test, y_test_pred_lr))\n",
    "\n",
    "# 还可以观察预测值与真值的散点图\n",
    "plt.figure(figsize=(8, 6))\n",
    "plt.scatter(y_train, y_train_pred_lr)\n",
    "plt.plot([0, 1], [0, 1], '--k')   # 数据已经标准化，3倍标准差即可\n",
    "plt.axis('tight')\n",
    "plt.xlabel('True cnt')\n",
    "plt.ylabel('Predicted cnt')\n",
    "# plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The value of default measurement of SGDRegressor on train is 0.819774629239724\n",
      "The value of default measurement of SGDRegressor on test is 0.6413450591909307\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:578: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    }
   ],
   "source": [
    "# 线性模型，随机梯度下降优化模型参数\n",
    "# 随机梯度下降一般在大数据集上应用，其实本项目不适合用\n",
    "from sklearn.linear_model import SGDRegressor\n",
    "\n",
    "# 使用默认配置初始化线\n",
    "sgdr = SGDRegressor(max_iter=1000)\n",
    "\n",
    "# 训练：参数估计\n",
    "sgdr.fit(X_train, y_train)\n",
    "\n",
    "# 预测\n",
    "# sgdr_y_predict = sgdr.predict(X_test)\n",
    "\n",
    "# 使用SGDRegressor模型自带的评估模块(评价准则为r2_score)，并输出评估结果\n",
    "print('The value of default measurement of SGDRegressor on train is', sgdr.score(X_train, y_train))\n",
    "print('The value of default measurement of SGDRegressor on test is', sgdr.score(X_test, y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.2 正则化的线性回归（L2正则 --> 岭回归）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of RidgeCV on train is 0.8197693384732916\n",
      "The r2 score of RidgeCV on test is 0.6411559404943287\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2212f70fc50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                   coef_lr                 coef_ridge      columns\n",
      "13        [0.138916015625]      [0.13773228316702973]        atemp\n",
      "11        [0.014404296875]     [0.014324918361938874]  weathersit2\n",
      "12     [0.010040283203125]     [0.010319979844203672]  weathersit3\n",
      "15  [-0.02773284912109375]    [-0.027833093197253626]    windspeed\n",
      "14      [-0.0325927734375]     [-0.03192088526599604]          hum\n",
      "0     [-64764413882.06916]     [-0.05391241175146817]      season1\n",
      "3    [-65015272315.243614]      [0.03223734063061806]      season4\n",
      "2     [-65745872716.42869]      [0.00544107361435945]      season3\n",
      "1     [-65982216395.82621]      [0.01573087707015704]      season2\n",
      "10     [-85677266856.7345]    [-0.040238858469321195]  weathersit1\n",
      "9     [-209898266366.7417]    [-0.001459752582611648]  workingday1\n",
      "8     [-214822014636.0157]      [0.01747472184291598]  workingday0\n",
      "7      [-235671124958.941]   [0.00028931862766598537]      weekday\n",
      "6    [-235671124958.94144]  [-0.00028931862766598537]     holiday1\n",
      "4     [-1670895636783.215]     [0.004574511942294648]         mnth\n",
      "5     [-1670895636783.226]   [-0.0045745119422950856]     holiday0\n",
      "alpha is: 1.0\n"
     ]
    }
   ],
   "source": [
    "# 岭回归／L2正则\n",
    "# class sklearn.linear_model.RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True,\n",
    "#                                  normalize=False, scoring=None, cv=None, gcv_mode=None,\n",
    "#                                  store_cv_values=False)\n",
    "from sklearn.linear_model import RidgeCV\n",
    "\n",
    "# 设置超参数（正则参数）范围\n",
    "alphas = [ 0.01, 0.1, 1, 10,100]\n",
    "# n_alphas = 20\n",
    "# alphas = np.logspace(-5,2,n_alphas)\n",
    "\n",
    "# 生成一个RidgeCV实例\n",
    "ridge = RidgeCV(alphas=alphas, store_cv_values=True)\n",
    "\n",
    "# 模型训练\n",
    "ridge.fit(X_train, y_train)\n",
    "\n",
    "# 预测\n",
    "y_test_pred_ridge = ridge.predict(X_test)\n",
    "y_train_pred_ridge = ridge.predict(X_train)\n",
    "\n",
    "# 评估，使用r2_score评价模型在测试集和训练集上的性能\n",
    "print('The r2 score of RidgeCV on train is', r2_score(y_train, y_train_pred_ridge))\n",
    "print('The r2 score of RidgeCV on test is', r2_score(y_test, y_test_pred_ridge))\n",
    "\n",
    "\n",
    "mse_mean = np.mean(ridge.cv_values_, axis=0)\n",
    "plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas), 1))\n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\": list(columns), \"coef_lr\": list(lr.coef_.T), \"coef_ridge\": list(ridge.coef_.T)})\n",
    "fs = fs.sort_values(by=['coef_lr'], ascending=False)\n",
    "print(fs)\n",
    "print('alpha is:', ridge.alpha_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.3 正则化的线性回归（L1正则 --> Lasso）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of LassoCV on train is 0.815887041190101\n",
      "The r2 score of LassoCV on test is 0.6286848389700768\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:1094: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xl8XXWd//HXp1nbpE2TJt3SNk3p\nRqGlS7ogZRNQUAYQqRSBQUWrM8PMOOoojvNTB2ceo+PMMDqjMig7OuxoEbQKKGtbmpYulC6kSZd0\ny9o0+/r5/XEvGmLSpG1Ozr3J+/l43EfuPfd7cz+nF+473+/3nO8xd0dEROREhoVdgIiIxD6FhYiI\n9EphISIivVJYiIhIrxQWIiLSK4WFiIj0SmEhIiK9UliIiEivFBYiItKrxLAL6C/Z2dk+derUsMsQ\nEYkrGzdurHD3nN7aDZqwmDp1KoWFhWGXISISV8xsX1/aaRhKRER6pbAQEZFeKSxERKRXCgsREemV\nwkJERHqlsBARkV4pLEREpFeD5jwLEZGhoq29g/1VDRSX17OnvI7czOFcOW9ioO+psBARiSMHjzVy\nw93r2F/V8IdtV50zUWEhIiIR5bXN3PST9VQ3tPDta+cyc/xIzshOJ2NEUuDvrbAQEYkDNQ2t3HzP\neo7UNPHwp5ewKC9rQN9fE9wiIjGupa2DTz2wgeLyeu7+80UDHhSgnoWISMz7n98VsXFfNd+/YQHn\nz+h1gdhAqGchIhLDthw4xg9+V8S1C3K56pxgJ7FPRGEhIhKjmlrb+eLjW8hJT+EbV50Vai0ahhIR\niVH/8ZtdFJXV8eCnlpAxPPgjnk5EPQsRkRj08u5yfvJqCTcuncIFM8OZp+hMYSEiEmMO1zTy+Uc3\nM3PsSP7xw3PCLgdQWIiIxJTW9g5u+9mbNLe288ObFjI8OSHskgDNWYiIxJR/+/XOPxwme0ZOetjl\n/IF6FiIiMeIXmw/y41dKuHlZXqiHyXZHYSEiEgM27qvm75/YypKpWfzjlWeGXc6fUFiIiITsQFUD\nqx4sZEJGKnfdvIiUxNiYp+gs0LAws8vNbJeZFZnZ7d08n2Jmj0afX29mU6Pbk8zsATPbZmY7zOyr\nQdYpIhKWmsZWbn1gA63tHdz7icVkpSWHXVK3AgsLM0sAfgBcAcwBbjCzrseA3QpUu/t04E7gO9Ht\nK4AUd58LLAI++26QiIgMFg0tbdx6/wZKKur50U2LYmpCu6sgexZLgCJ3L3b3FuAR4Oouba4GHoje\nfwK4xMwMcCDNzBKB4UALcDzAWkVEBlRzWzuffWgjm/ZX872VCzhvenbYJZ1QkGGRCxzo9Lg0uq3b\nNu7eBtQAY4gERz1wGNgP/Lu7VwVYq4jIgGlr7+Dzj2zmlXcq+PZH5/GhuRPCLqlXQZ5nYd1s8z62\nWQK0AxOBTOAVM3ve3Yvf82KzVcAqgClTppx2wSIiQTt0rJG/+b83KdxXzf+7cg4fK5gcdkl9EmTP\nohTo/K8wCTjUU5vokFMGUAV8HPi1u7e6exnwGlDQ9Q3c/W53L3D3gpyc8NdOERE5kRd3HuVD33+F\nHYeP872V87l1eX7YJfVZkGGxAZhhZvlmlgysBFZ3abMauCV6/zrgRXd3IkNP77eINGAZsDPAWkVE\nAlPT2Mo/PL2NT91fyISM4Tzz18u5en7XUfnYFtgwlLu3mdltwBogAbjX3beb2R1AobuvBu4BHjKz\nIiI9ipXRl/8AuA94i8hQ1X3uvjWoWkVEguDu/OqtI3xj9XYq65r59PJ8vvTBWaQmxd55FL2xyB/y\n8a+goMALCwvDLkNEBIDaplb+4em3eGbLIc6aOIpvXzuPuZMywi7rT5jZRnf/k2H+rrSQoIhIP3vr\nYA23/WwT+6sa+OJlM/mLi84gMSG+F8xQWIiI9JOODuf+1/fy7V/tJDMtif/7zDKWThsTdln9QmEh\nItIPSqsb+PvHt7K2uJL3zx7Ld6+bx5j0lLDL6jcKCxGR0/T7XWXc9rM3Afi3j85jRcEkIotRDB4K\nCxGR09De4Xxz9XbGZ6Ry3ycWMzlrRNglBSK+Z1xEREK2ZvsR9lY28IXLZg7aoACFhYjIKXN37npp\nD/nZaXzwrPFhlxMohYWIyClau6eSraU1fOb8aSQMG1xzFF0pLERETtGPXtpDdnoK1y6Mr6U7ToXC\nQkTkFGw/VMMr71TwyfOmxuXyHSdLYSEicgrueaWE9JREblqWF3YpA0JhISJyko43tfLstsNcs2Ai\nGcOTwi5nQCgsRERO0i+3HKa5rYMVi+LjwkX9QWEhInKSHis8wMxx6cyLwVVkg6KwEBE5CUVltWw+\ncIwViyYPuiU9TkRhISJyEh4vLCVhmHHNgsF/uGxnCgsRkT5qa+/gqTcP8v7ZY8kZOXhWlO0LhYWI\nSB+9tLuc8tpmViyaFHYpA05hISLSR09tOkh2ejIXzx4bdikDTmEhItIH7s664kounDmWpDi/ROqp\nGHp7LCJyCvZVNlBZ38LCvNFhlxIKhYWISB9s2l8NwKK8zJArCYfCQkSkDzbuqyY9JZEZY0eGXUoo\nAg0LM7vczHaZWZGZ3d7N8ylm9mj0+fVmNjW6/UYz29zp1mFm84OsVUTkRDbtP8aCKaMH/XUrehJY\nWJhZAvAD4ApgDnCDmc3p0uxWoNrdpwN3At8BcPefuvt8d58P3AzsdffNQdUqInIidc1t7DpynAVT\nhuYQFATbs1gCFLl7sbu3AI8AV3dpczXwQPT+E8Al9qfnz98A/F+AdYqInNCWA8fo8KE7XwHBhkUu\ncKDT49Lotm7buHsbUAOM6dLmehQWIhKiTfsik9vzJw/NI6Eg2LDobmDPT6aNmS0FGtz9rW7fwGyV\nmRWaWWF5efmpVyoicgIb91czY2z6kLl2RXeCDItSoPNi75OAQz21MbNEIAOo6vT8Sk7Qq3D3u929\nwN0LcnJy+qVoEZHOOjqcN/cfG9JDUBBsWGwAZphZvpklE/niX92lzWrgluj964AX3d0BzGwYsILI\nXIeISCiKK+qoaWxl4RCe3AZIDOoXu3ubmd0GrAESgHvdfbuZ3QEUuvtq4B7gITMrItKjWNnpV1wA\nlLp7cVA1ioj0ZtO+YwAsHOI9i8DCAsDdnwOe67Lt653uNxHpPXT32t8Dy4KsT0SkN5v2V5MxPIlp\n2WlhlxIqncEtInIChfuqWTBlNMOG6Ml471JYiIj0oKKumaKyOpbkZ4VdSugUFiIiPdhQEjk4c2l+\n19O/hh6FhYhID9aXVDE8KYG5uRlhlxI6hYWISA/Wl1SxMG80yYn6qtS/gIhIN2oaWtl55LiGoKIU\nFiIi3XhjbxXusFST24DCQkSkW2+UVJKcOIxzhvDigZ0pLEREurG+pIr5k0eTmpQQdikxQWEhItJF\nbVMrbx2s0RBUJwoLEZEuNu6rpsN1fkVnCgsRkS7Wl1SROMxYmKf5incpLEREulhfXMncSRmMSA50\nrdW4orAQEemkrrmNraU1nDtNQ1CdKSxERDpZt6eStg5n+YzssEuJKQoLEZFOXi2qIDVp2JC/jGpX\nCgsRkU5eeaecJfljSEnU+RWdKSxERKIO1zSyp7ye86drCKorhYWISNQr71QAaL6iGwoLEZGoV9+p\nIDs9hdnjR4ZdSsxRWIiIAB0dzmtFFSyfPgazoX297e4oLEREgB1HjlNZ38LyGTlhlxKTFBYiIkSG\noACWa3K7W4GGhZldbma7zKzIzG7v5vkUM3s0+vx6M5va6bl5ZrbWzLab2TYzSw2yVhEZ2l4tqmDG\n2HTGZ+irpjuBhYWZJQA/AK4A5gA3mNmcLs1uBardfTpwJ/Cd6GsTgYeBz7n7WcBFQGtQtYrI0NbY\n0s4bJVU6CuoEguxZLAGK3L3Y3VuAR4Cru7S5Gnggev8J4BKLzCx9ANjq7lsA3L3S3dsDrFVEhrBX\niypobuvg0jPHhV1KzAoyLHKBA50el0a3ddvG3duAGmAMMBNwM1tjZpvM7MsB1ikiQ9wLO44yMiWR\nxVN1saOeBLn+bnfHnnkf2yQCy4HFQAPwgpltdPcX3vNis1XAKoApU6acdsEiMvR0dDjP7yjjwlk5\nJCfqmJ+eBPkvUwpM7vR4EnCopzbReYoMoCq6/SV3r3D3BuA5YGHXN3D3u929wN0LcnJ0uJuInLyt\nB2uoqGvWEFQvggyLDcAMM8s3s2RgJbC6S5vVwC3R+9cBL7q7A2uAeWY2IhoiFwJvB1iriAxRz799\nlIRhxkWz9AfniQQ2DOXubWZ2G5Ev/gTgXnffbmZ3AIXuvhq4B3jIzIqI9ChWRl9bbWb/SSRwHHjO\n3Z8NqlYRGbqe33GUgrxMRo9IDruUmBboNQPd/TkiQ0idt3290/0mYEUPr32YyOGzIiKBKK1uYOeR\nWv7xw2eGXUrM02yOiAxZL+woA+ASzVf0SmEhIkPW8zuOckZOGvnZaWGXEvMUFiIyJNU0trKuuFJH\nQfVRn8PCzJab2Sej93PMLD+4skREgvWb7UdobXcuP3t82KXEhT6FhZl9A/gK8NXopiQ0+SwiceyX\nWw8zKXM48yePDruUuNDXnsVHgKuAegB3PwToUlIiEpeq61t4raiCD8+boAsd9VFfw6IlerKcA5iZ\nZoNEJG79evsR2jqcP5s3MexS4kZfw+IxM/tfYLSZfQZ4HvhxcGWJiATnl1sPkZ+dxlkTR4VdStzo\n00l57v7vZnYZcByYBXzd3X8baGUiIgEor21m7Z5K/uri6RqCOgl9CovosNOL7v5bM5sFzDKzJHfX\nBYlEJK78+q3DdDhcqSGok9LXYaiXgRQzyyUyBPVJ4P6gihIRCcozWw8zY2w6s8brGJ2T0dewsOhS\n4dcC/+3uHyFyqVQRkbhxuKaRDXur1Ks4BX0OCzM7F7gReHf110AXIRQR6W9PbTqIO1yzQGFxsvoa\nFn8L3A48FV1mPB94MbiyRET6l7vzeOEBlk3LIm+Mjv4/WX3tHTQAHcANZnYTkcuhdr1EqohIzNqw\nt5q9lQ389ftnhF1KXOprWPwU+BLwFpHQEBGJK48VHiA9JZEr5motqFPR17Aod/dnAq1ERCQgdc1t\nPLv1MNcsmMiIZE23noq+/qt9w8x+ArwANL+70d2fCqQqEZF+9OzWQzS2trOiYHLYpcStvobFJ4HZ\nRFabfXcYygGFhYjEvMcLSzkjJ40FWmH2lPU1LM5x97mBViIiEoCisloK91Xz1Stma3mP09DXQ2fX\nmZlOwhORuPPg2n0kJwzjo4smhV1KXOtrz2I5cIuZlRCZszDA3X1eYJWJiJym402tPLGxlD87ZyLZ\n6SlhlxPX+hoWlwdahYhIAJ4oLKWhpZ1PvG9q2KXEvT4NQ7n7vu5uvb3OzC43s11mVmRmt3fzfIqZ\nPRp9fr2ZTY1un2pmjWa2OXq762R3TESGto4O58G1e1mUl8ncSRlhlxP3Ajvg2MwSgB8AlwGlwAYz\nW+3ub3dqditQ7e7TzWwl8B3g+uhze9x9flD1icjg9tLucvZWNvCFD8wKu5RBoa8T3KdiCVDk7sXu\n3gI8Alzdpc3VwAPR+08Al5gOVxCRfnDf63sZOzKFK87WGdv9IciwyAUOdHpcGt3WbRt3bwNqgDHR\n5/LN7E0ze8nMzg+wThEZZIrK6nh5dzk3LcsjKSHIr7mhI8jz3rvrIXRdfLCnNoeBKe5eaWaLgJ+b\n2Vnufvw9LzZbBawCmDJlSj+ULCKDwf++tIeUxGF8fKm+F/pLkJFbCnQ+t34ScKinNmaWCGQAVe7e\n7O6VAO6+EdgDzOz6Bu5+t7sXuHtBTk5OALsgIvGmtLqBp988yA1Lpuhw2X4UZFhsAGaYWb6ZJQMr\ngdVd2qwGbonev47Idb7dzHKiE+SY2TRgBlAcYK0iMkj8+OXIV8WqC6aFXMngEtgwlLu3mdltwBog\nAbg3euGkO4BCd18N3AM8ZGZFQBWRQAG4ALjDzNqAduBz7l4VVK0iMjiU1zbzyIYDXLswl4mjh4dd\nzqAS6Fq97v4c8FyXbV/vdL8JWNHN654EngyyNhEZfO55tYTW9g7+4qLpYZcy6OgwAREZFGoaWnl4\n3T4+NHcC+dm6bGp/U1iIyKBw3+sl1DW38ZfqVQRCYSEice94Uyv3vlrCB+aMY87EUWGXMygpLEQk\n7t3/2l6ON7XxN5fMCLuUQUthISJxrbaplXteLeHSM8dxdq4WDAyKwkJE4toDr++lprGVv1WvIlAK\nCxGJW7VNrfz4lRIumT1Wy5AHTGEhInHrwbX7qGls1VzFAFBYiEhcqmtu48evFHPxrBzOmTw67HIG\nPYWFiMSlB9fu5VhDK3976Z+sMSoBUFiISNypb27jxy8Xc+HMHOarVzEgFBYiEnceWreP6oZW/vZS\nzVUMFIWFiMSVhpZIr+L8GdksnJIZdjlDhsJCROLKg2v3UVnfwufVqxhQCgsRiRs1Da388HdFXDQr\nh0V5WWGXM6QoLEQkbvzopT3UNrfx5Q/ODruUIUdhISJx4XBNI/e9VsI183O1smwIFBYiEhe+9/w7\nuMMXLtN5FWFQWIhIzCsqq+OxwgPcuGwKk7NGhF3OkKSwEJGY5u780zPbGZGcyG0X6yp4YVFYiEhM\ne3LTQV55p4IvXz6LMekpYZczZCksRCRmldc2861fvk1BXiY3Lc0Lu5whTWEhIjHrm89sp7GlnW9/\ndB7DhlnY5QxpCgsRiUm/2X6EZ7ce5q/fP53pY9PDLmfICzQszOxyM9tlZkVmdns3z6eY2aPR59eb\n2dQuz08xszoz+1KQdYpIbDl4rJEvP7mVMyeM4rMXnhF2OUKAYWFmCcAPgCuAOcANZjanS7NbgWp3\nnw7cCXyny/N3Ar8KqkYRiT3Nbe385U830d7u/PDGhSQnagAkFgT5KSwBity92N1bgEeAq7u0uRp4\nIHr/CeASMzMAM7sGKAa2B1ijiMSYf/7lDrYcOMZ3V8wjPzst7HIkKsiwyAUOdHpcGt3WbRt3bwNq\ngDFmlgZ8BfinE72Bma0ys0IzKywvL++3wkUkHE+/WcpD6/ax6oJpXH72hLDLkU6CDIvuDl3wPrb5\nJ+BOd6870Ru4+93uXuDuBTk5OadYpojEgk37q/nKk9tYkp/Flz84K+xypIvEAH93KTC50+NJwKEe\n2pSaWSKQAVQBS4HrzOzfgNFAh5k1ufv/BFiviISktLqBVQ8WMn5UKnfdtIjEBM1TxJogw2IDMMPM\n8oGDwErg413arAZuAdYC1wEvursD57/bwMy+CdQpKEQGp7rmNj79QCHNbR08sqqArLTksEuSbgQW\nFu7eZma3AWuABOBed99uZncAhe6+GrgHeMjMioj0KFYGVY+IxB5354uPbeadsjru+8Ripo8dGXZJ\n0oMgexa4+3PAc122fb3T/SZgRS+/45uBFCcioXv6zYOs2X6Ur14xmwtmat4xlmlgUERCcaSmiW+u\n3k5BXiafPn9a2OVILxQWIjLg3J2vPrWVlvYOvrviHBK07lPMU1iIyIB7fGMpv9tVzlcun60T7+KE\nwkJEBlRpdQN3PPM2S/KzuOXcqWGXI32ksBCRAdPR4XzxsS24O/+x4hwtOx5HFBYiMmDuebWE9SVV\nfOOqs3Qt7TijsBCRAbHzyHG+u2YXl80Zx4pFk8IuR06SwkJEAtfU2s7nH9nMqOGJ/Ou1c4kuLi1x\nJNCT8kREAO745dvsPFLLvZ8oIDs9Jexy5BQM+Z5Fc1s7eyvqaWptD7sUkUHpF5sP8rP1+/nshdN4\n/+xxYZcjp2jI9yx2Hanlqv95DYDRI5IYPyqViaOHM3F05Gfu6OFMyhxO7ugRjB2ZoqM3RE7CnvI6\n/uGpbRTkZfKlD2jZ8Xg25MMid/Rw/vNj53C4pokjNU0crmnkcE0Tm/ZXc6yh9T1tkxOHMTlzOFOy\nRpA3Jo2pY0aQl53GtOw0JmWO0FmoIp3UN7fxVz/dREpSAv/98QUkadnxuDbkw2JMegrXLuz+yIz6\n5jYOHWuk9FgjpdWNlFY1sL+qgX2VDbxRUkV9yx+HrpIThpE3ZgRn5KQzfWw6M8ZFfk4fm05KYsJA\n7Y5ITOjocL7w2GZ2H63lvk8uYULG8LBLktM05MPiRNJSEpkxbiQzxv3pssnuTkVdC3sr6ykpr2dP\nRR17yurZfbSW3+44SntH5KKACcOMqWNGMHv8KM6cMJLZ40cxZ+IoJmSk6ogQGbT+6/ndrNl+lP93\n5Rwu1Gqyg4LC4hSZGTkjU8gZmcLiqVnveS4yad7A7qO17D5ay84jtWw9eIxntx3+Q5sxacmclZvB\n3NxRzJs0mnMmjWZ8RupA74ZIv3tmyyG+/2IR1xdM5lPnTQ27HOknCosApCQmMGv8SGaNf2+PpLap\nlV1Hatl+6DhvHaxh28Ea7iqq+EMvZNyoFBZMzmRRXiYL8zKZm5tBcqLGeSV+vFFSxZce38KSqVl8\n65qz1XseRBQWA2hkahIFU7Mo6NQTaWptZ/uh42w5cIwtpcfYtL+aX28/AkBK4jDmTx7N0vwslk0b\nw8K8TFKTNP8hsemtgzXcev8GJmUO566bF+kPnUHGIpe8jn8FBQVeWFgYdhn9oqy2iU37qnmjpJoN\ne6vYfqiGDo9Mos+fMprl07NZPiObebkZurC9xIQ95XV87K61pCYl8PjnzmXiaE1oxwsz2+juBb22\nU1jEvtqmVgr3VrO2uJLX91Sw/dBx3GFUaiLLZ2Rz0cyxXDgrh3GjNOchA29/ZQMr715Lc1sHj3/u\nXKblpIddkpyEvoaFhqHiwMjUJC6ePZaLZ48FoKq+hdeKKnjlnXJe2l3Oc9siw1ZzczO49MxxXDpn\nLHMmjNJ4sQSuqKyOG3+yjua2Dh6+damCYhBTzyLOuTs7j9Ty4s4yXthxlDcPHMMdJmUO54qzx3P5\n2RNYMHm0zjyXfvf2oePcfM96zIyHP72E2eNHhV2SnAINQw1R5bXNvLjzKL9+6wivFlXQ2u5MyEjl\nynkT+LNzJjI3N0M9Djlt64sr+cyDhaSnJPLwp9WjiGcKC6GmsZUXdhzl2a2HefmdclrbnaljRnDt\nwkl8ZEGuLj4jp+TJjaXc/tRWpmSN4P5PLtF/R3EuJsLCzC4HvgckAD9x9293eT4FeBBYBFQC17v7\nXjNbAtz9bjPgm+7+9IneS2FxYjUNrfx6+2F+/uYh1hZXArA0P4vrF0/mirMnMDxZh+TKiXV0OHc+\nv5v/frGI950xhh/duIiMEUlhlyWnKfSwMLMEYDdwGVAKbABucPe3O7X5S2Ceu3/OzFYCH3H3681s\nBNDi7m1mNgHYAkx097ae3k9h0Xel1Q38/M2DPLGxlL2VDYxMTeSa+bncuGyKxp2lWzUNrXzhsc28\nsLOMlYsn861rztbCgINELITFuUR6BB+MPv4qgLv/a6c2a6Jt1ppZInAEyPFORZlZPrAOyFVY9C93\nZ31JFY9uOMCz2w7T0tZBQV4mNy3L40NzJ+ikKgFga+kx/vKnmzh6vIl//PAc/vzcPM17DSJ9DYsg\nvw1ygQOdHpdGt3XbJhoENcAYADNbambbgW3A57oLCjNbZWaFZlZYXl4ewC4MbmbGsmljuPP6+az/\n6iV87UNnUlHXzOcf3cx533mR7z3/DhV1zWGXKSFxdx5au5frfrSWjg7nsc+eyy3vm6qgGKKCPM+i\nu/+iunZjemzj7uuBs8zsTOABM/uVuze9p6H73UTnNgoKCgbHTH1IMtOS+cwF07h1eT4vv1POfa/t\n5c7nd/OD3xfx0YW5fPr8aZyhI16GjONNrdz+5Fae23aEi2blcOfH5pOZlhx2WRKiIMOiFJjc6fEk\n4FAPbUqjw1AZQFXnBu6+w8zqgbMBjTMFbNgw46JZY7lo1liKyuq497USnthYyiMbDnDpmeP4q4un\nM3/y6LDLlABt3FfN3z26mYPHGrn9itmsOn+aztORQOcsEolMcF8CHCQywf1xd9/eqc1fAXM7TXBf\n6+4fi85THIhOcOcBa4lMhFf09H6aswhOeW0zD67dy4Nr91HT2Mr5M7L56/fPYEl+Vq+vlfjR0NLG\nd9fs4v7X9zIxYzjfv2E+i/L0GQ92oU9wR4v4EPBfRA6dvdfd/8XM7gAK3X21maUCDwELiPQoVrp7\nsZndDNwOtAIdwB3u/vMTvZfCInh1zW08vG4fP3mlmIq6Fs6bPoYvXDaLRXmZYZcmp+l3u8r4+i/e\n4kBVIzcvy+MrV8wmPUWrAQ0FMREWA0lhMXAaW9r56fp93PXSHirqWrhwZg5//8FZnJ2bEXZpcpKK\nymr552d38Ptd5eRnp/Hta+eydNqYsMuSAaSwkMA1tLTxwOv7+N+X93CsoZUr503gix+YRX52Wtil\nSS8OVDXwo5f28OiGA4xISuBvLpnBLe+bqsOlhyCFhQyY402t/PjlYn7ySgkt7R1ccfZ4PnlePgun\njNZhljGmqKyOu17aw9NvHiTBjOsXT+bzl85gTHpK2KVJSBQWMuDKapv48cvFPLLhALVNbcyblMGF\nM3M4OzeDubkZTMhIVXiEoKPD+d2uMu5/fS+vvFNBSuIwPr50CqsumMaEDF2kaKhTWEho6pvbeGpT\n5HDbHYePE73EODkjUzhn0mjmT85g/uRMzpmcwchUrS0UhLb2Dt4oqWLN9iOs2X6UI8ebGDcqhZuW\n5nHD0ilkqychUQoLiQmNLe28ffg4bx2sYUvpMbYcOMae8noAzGDWuJEszMukIC+TgrwsJmcNV+/j\nFLR3OG8fOs7a4grWFVexoaSK2uY2UpOGccGMHK6aP5EPnjVe6znJn1BYSMyqaWxly4FjbNpfzab9\nx3hzXzW1zZHVXMaOTGHx1CwWT81kcX4WZ44fpRPCuuHuFJXV8dLuctbuqeSNaDgATMtJY9m0MVww\nI5sLZuYwIlmHwErPdFlViVkZw5O4YGYOF8zMASJ/Fe8+WkvhvmoK91ZRuLeaZ7cd/kPbxVOzWDYt\ni/OmZzNr3MghGR4tbR3sPlrLtoM1bN5/jFeLKjh4rBGAadlpXHnORM49YwzL8rMYq2uxSwDUs5CY\ndPBYI2+UVLJuTxXrSirZV9kAwJi0ZJadEfmrefmMHHJHD94JWndn0/5qHnkjsipwQ0s7AKNSEzn3\njDFcOHMsF84a3P8GEjwNQ8kbZ5Q2AAAIrklEQVSgcuhYI6/vqeT1ogpeLaqgrDayGu60nDQuin5p\nLs3PIjUp/i/iVNPQypObSvnZG/spKqsjLTmBK+dNZPmMbOZNymBK1gjN60i/UVjIoOXuvFNWx8u7\ny3n5nQrWFVfS0tZBatIwzjsjm/efOZaLZ41lYhz9xd3c1s7aPZU8u/Uwz2w9RFNrBwumjOaGxVP4\n8LwJpGnpDQmIwkKGjMaWdtaVVPL7nWW8sLOM0urIWP7krOEsnprForxMJmWOYPyoVMaPSmXU8MTQ\n/zJvbe/g7UPHeXN/NetLqnh5dzn1Le2kJSdw1fxcblo2hbMmavkUCZ7CQoakzkcJbdhbxYa91VTV\nt7ynTXLiMMaNSmHsyFSy05PJGZlCdnoKY9KSyUxLJmtEMhkjkhiVmsSo4UmkJSeQeBKHnLa2d3C8\nsZXjTW1U1bdQUddMRV0zR2qaKC6vp7iinuLyOprbOgCYkJHKxbPHctmccZw7bcygGEqT+KGwECES\nHqXVjRw53sSRmiaOHm+irLaZsujP8trIF3l1Q+sJf09K4jBGJCeQmpRAYoKRlDAMA9yhw52Wtg4a\nWttpaGmnJRoCXSUMMyZnDic/O40zctKZP2U0C6dkxtVwmQw+OnRWhMilYydnjWBy1ogTtmtt76C6\noYXq+laq6luoaWzleFMrxxtbqW9up6GljfqWNlraOmhtd1raI4EwzIxhBkkJkTAZnpxAWnIiGcOT\nIrcRSeSkR3su6ck6KU7ilsJChMiX/diRqYwdqXMURLqjP3NERKRXCgsREemVwkJERHqlsBARkV4p\nLEREpFcKCxER6ZXCQkREeqWwEBGRXg2a5T7MrBzYF3YdJ5ANVIRdRD/RvsSewbIfoH0ZaHnuntNb\no0ETFrHOzAr7sv5KPNC+xJ7Bsh+gfYlVGoYSEZFeKSxERKRXCouBc3fYBfQj7UvsGSz7AdqXmKQ5\nCxER6ZV6FiIi0iuFRUDM7FtmttXMNpvZb8xsYg/t2qNtNpvZ6oGusy9OYl9uMbN3ordbBrrOvjCz\n75rZzuj+PG1mo3tot9fMtkX3OeYuwXgS+3G5me0ysyIzu32g6+wLM1thZtvNrMPMejxyKNY/Ezip\nfYn5z+VPuLtuAdyAUZ3u/w1wVw/t6sKutT/2BcgCiqM/M6P3M8OuvZs6PwAkRu9/B/hOD+32Atlh\n13s6+wEkAHuAaUAysAWYE3bt3dR5JjAL+D1QcIJ2Mf2Z9HVf4uVz6XpTzyIg7n6808M0IG4nh/q4\nLx8EfuvuVe5eDfwWuHwg6jsZ7v4bd2+LPlwHTAqznlPVx/1YAhS5e7G7twCPAFcPVI195e473H1X\n2HX0hz7uS1x8Ll0pLAJkZv9iZgeAG4Gv99As1cwKzWydmV0zgOWdlD7sSy5woNPj0ui2WPYp4Fc9\nPOfAb8xso5mtGsCaTkVP+xGPn8mJxNNnciJx+bnoGtynwcyeB8Z389TX3P0X7v414Gtm9lXgNuAb\n3bSd4u6HzGwa8KKZbXP3PQGW3a1+2Bfr5rWh9KZ625dom68BbcBPe/g150U/l7HAb81sp7u/HEzF\n3euH/Yirz6QPQv9MoF/2JWY+l5OhsDgN7n5pH5v+DHiWbsLC3Q9Ffxab2e+BBUTGMwdUP+xLKXBR\np8eTiIzbDrje9iU6+X4lcIlHB5G7+R3vfi5lZvY0kaGDAf1i6of9KAUmd3o8CTjUfxX23Un893Wi\n3xH6ZxJ9/9Pdl5j5XE6GhqECYmYzOj28CtjZTZtMM0uJ3s8GzgPeHpgK+64v+wKsAT4Q3adMIhOw\nawaivpNhZpcDXwGucveGHtqkmdnId+8T2Ze3Bq7K3vVlP4ANwAwzyzezZGAlEJNH3PUmHj6TkxCf\nn0vYM+yD9QY8SeQ/5q3AM0BudHsB8JPo/fcB24gcDbENuDXsuk91X6KPPwUURW+fDLvuHvaliMh4\n8ebo7a7o9onAc9H706KfyRZgO5HhhdBrP9n9iD7+ELCbSG815vYjWuNHiPy13QwcBdbE42fS132J\nl8+l601ncIuISK80DCUiIr1SWIiISK8UFiIi0iuFhYiI9EphISIivVJYyJBnZnWn+fonomfgn6jN\n70+0Cmlf23Rpn2Nmv+5re5HTobAQOQ1mdhaQ4O7FA/3e7l4OHDaz8wb6vWXoUViIRFnEd83sreh1\nE66Pbh9mZj+MXqfgl2b2nJldF33ZjcAvOv2OH0UXhtxuZv/Uw/vUmdl/mNkmM3vBzHI6Pb3CzN4w\ns91mdn60/VQzeyXafpOZva9T+59HaxAJlMJC5I+uBeYD5wCXAt81swnR7VOBucCngXM7veY8YGOn\nx19z9wJgHnChmc3r5n3SgE3uvhB4ifeus5Xo7kuAz3faXgZcFm1/PfD9Tu0LgfNPfldFTo4WEhT5\no+XA/7l7O3DUzF4CFke3P+7uHcARM/tdp9dMAMo7Pf5YdPnsxOhzc4gsk9JZB/Bo9P7DwFOdnnv3\n/kYiAQWQBPyPmc0H2oGZndqXEVlKQiRQCguRP+pu6egTbQdoBFIBzCwf+BKw2N2rzez+d5/rRec1\nd5qjP9v54/+ff0dknaFziIwGNHVqnxqtQSRQGoYS+aOXgevNLCE6j3AB8AbwKvDR6NzFON67FPsO\nYHr0/iigHqiJtruih/cZBrw75/Hx6O8/kQzgcLRnczORy3K+aybxu/qqxBH1LET+6Gki8xFbiPy1\n/2V3P2JmTwKXEPlS3g2sB2qir3mWSHg87+5bzOxNIquiFgOv9fA+9cBZZrYx+nuu76WuHwJPmtkK\n4HfR17/r4mgNIoHSqrMifWBm6e5eZ2ZjiPQ2zosGyXAiX+DnRec6+vK76tw9vZ/qehm42iPXPRcJ\njHoWIn3zSzMbDSQD33L3IwDu3mhm3yByDeX9A1lQdKjsPxUUMhDUsxARkV5pgltERHqlsBARkV4p\nLEREpFcKCxER6ZXCQkREeqWwEBGRXv1/Y/9tI9Vv01YAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2212f8d6978>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "alpha is: 0.004469509183788031\n",
      "      coef_lasso                 coef_lr                 coef_ridge  \\\n",
      "13  1.262800e-01        [0.138916015625]      [0.13773228316702973]   \n",
      "11  1.093721e-02        [0.014404296875]     [0.014324918361938874]   \n",
      "12  5.895537e-03     [0.010040283203125]     [0.010319979844203672]   \n",
      "15 -2.349852e-02  [-0.02773284912109375]    [-0.027833093197253626]   \n",
      "14 -2.418003e-02      [-0.0325927734375]     [-0.03192088526599604]   \n",
      "0  -7.043727e-02    [-64764413882.06916]     [-0.05391241175146817]   \n",
      "3   1.493016e-02   [-65015272315.243614]      [0.03223734063061806]   \n",
      "2  -0.000000e+00    [-65745872716.42869]      [0.00544107361435945]   \n",
      "1   0.000000e+00    [-65982216395.82621]      [0.01573087707015704]   \n",
      "10 -3.792712e-02     [-85677266856.7345]    [-0.040238858469321195]   \n",
      "9  -0.000000e+00    [-209898266366.7417]    [-0.001459752582611648]   \n",
      "8   1.984727e-02    [-214822014636.0157]      [0.01747472184291598]   \n",
      "7   0.000000e+00     [-235671124958.941]   [0.00028931862766598537]   \n",
      "6  -0.000000e+00   [-235671124958.94144]  [-0.00028931862766598537]   \n",
      "4   4.732568e-03    [-1670895636783.215]     [0.004574511942294648]   \n",
      "5  -4.961891e-18    [-1670895636783.226]   [-0.0045745119422950856]   \n",
      "\n",
      "        columns  \n",
      "13        atemp  \n",
      "11  weathersit2  \n",
      "12  weathersit3  \n",
      "15    windspeed  \n",
      "14          hum  \n",
      "0       season1  \n",
      "3       season4  \n",
      "2       season3  \n",
      "1       season2  \n",
      "10  weathersit1  \n",
      "9   workingday1  \n",
      "8   workingday0  \n",
      "7       weekday  \n",
      "6      holiday1  \n",
      "4          mnth  \n",
      "5      holiday0  \n",
      "alpha is: 1.0\n"
     ]
    }
   ],
   "source": [
    "# ### Lasso／L1正则\n",
    "# class sklearn.linear_model.LassoCV(eps=0.001, n_alphas=100, alphas=None, fit_intercept=True,\n",
    "#                                    normalize=False, precompute=’auto’, max_iter=1000,\n",
    "#                                    tol=0.0001, copy_X=True, cv=None, verbose=False, n_jobs=1,\n",
    "#                                    positive=False, random_state=None, selection=’cyclic’)\n",
    "\n",
    "\n",
    "# 设置超参数搜索范围\n",
    "# alphas = [ 0.01, 0.1, 1, 10,100]\n",
    "\n",
    "# 生成一个LassoCV实例\n",
    "# lasso = LassoCV(alphas=alphas)\n",
    "lasso = LassoCV()\n",
    "\n",
    "#训练（内含CV）\n",
    "lasso.fit(X_train, y_train)\n",
    "\n",
    "#测试\n",
    "y_test_pred_lasso = lasso.predict(X_test)\n",
    "y_train_pred_lasso = lasso.predict(X_train)\n",
    "\n",
    "\n",
    "# 评估，使用r2_score评价模型在测试集和训练集上的性能\n",
    "print('The r2 score of LassoCV on train is', r2_score(y_train, y_train_pred_lasso))\n",
    "print('The r2 score of LassoCV on test is', r2_score(y_test, y_test_pred_lasso))\n",
    "\n",
    "mses = np.mean(lasso.mse_path_, axis=1)\n",
    "plt.plot(np.log10(lasso.alphas_), mses)\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n",
    "\n",
    "print('alpha is:', lasso.alpha_)\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\": list(columns),\n",
    "                   \"coef_lr\": list(lr.coef_.T),\n",
    "                   \"coef_ridge\": list(ridge.coef_.T),\n",
    "                   \"coef_lasso\": list(lasso.coef_.T)})\n",
    "fs = fs.sort_values(by=['coef_lr'], ascending=False)\n",
    "print(fs)\n",
    "print('alpha is:', ridge.alpha_)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
